package eu.catengine.common.iface;

import javax.microedition.khronos.opengles.GL10;

import eu.catengine.primitive.Point;

public interface IRenderable
{
    /**
     * Ustawia nazwę obiektu na podaną jako parametr.
     */
    public void setName(String name);

    /**
     * Zwraca nazwę obiektu.
     */
    public String getName();

    /**
     * Ustawia widoczność obiektu w scenie.
     * 
     * @param visible
     *            <code>boolean</code> True, jeśli obiekt ma być widoczny. False, jeśli ma
     *            zostać ukryty.
     */
    public void setVisible(boolean visible);

    /**
     * Zwraca widoczność obiektu w scenie.
     * 
     * @return <code>boolean</code> True, jeśli obiekt jest widoczny. False, jeśli jest
     *         ukryty.
     */
    public boolean isVisible();

    /**
     * Ustawia współrzędne wierzchołków obiektu. <br>
     * <b>Wywoływane automatycznie.</b> <br>
     * Nie należy wywoływać metody ręcznie.
     * 
     * @param vertices
     *            <code>float[]</code> tablica wierzchołków.
     */
    public void setVertices(float[] vertices);

    /**
     * Pobiera współrzędne wierzchołków obiektu.
     * 
     * @return <code>float[]</code> tablica wierzchołków.
     */
    public float[] getVertices();

    /**
     * Ustawia czas dodania obiektu do sceny.
     * 
     * @param elapsedTime
     *            <code>long</code> czas sceny.
     */
    public void setStartTime(long elapsedTime);

    /**
     * Zwraca czas dodania obiektu do sceny.
     * 
     * @return <code>long</code> czas sceny.
     */
    public long getStartTime();

    /**
     * Ustawia informację, czy dany obiekt ma korzystać z wbudowanej metody
     * <code>update()</code>.
     * 
     * @param updateNeeded
     *            <code>boolean</code> True, jeśli tak, w przeczywnym razie False.
     */
    public void setUpdateNeeded(boolean updateNeeded);

    /**
     * Zwraca informcję, czy dany obiekt korzysta z wbudowanej metody
     * <code>update()</code>.
     * 
     * @return <code>boolean</code> True, jeśli tak, w przeczywnym razie False.
     */
    public boolean isUpdateNeeded();

    /**
     * Ustawia informację, czy dany obiekt ma nadal być przechowywany w scenie.
     * 
     * @param keepInScene
     *            <code>boolean</code> True, jeśli tak, w przeczywnym razie False.
     */
    public void setKeepInScene(boolean keepInScene);

    /**
     * Zwraca informację, czy dany obiekt ma nadal być przechowywany w scenie.
     */
    public boolean getKeepInScene();

    /**
     * Aktualizuje bufor wierzchołków dla obiektu. Wywoływane automatycznie.
     */
    public void updateBuffer();
    
    /**
     * Zwraca punkt zaczepienia obiektu (lewy górny róg).
     */
    public Point getAnchorPoint();

    /**
     * Zwraca punkt środka obiektu.
     */
    public Point getCenterPoint();

    /**
     * Zwraca informację czy obiekt znajduję się w danym punkcie.
     * @param point <code>Point</code> Punkt w którym może znajdować się obiekt.
     * @return <code>boolean</code> True, jeśli obiekt występuje w danym punkcie, w przeciwnym razie False. 
     */
    public boolean isAtPoint(Point point);
    
    /**
     * Zwraca informację czy obiekt znajduję się w danym punkcie.
     * @param x <code>float</code> Współrzędna X w którym może znajdować się obiekt.
     * @param y <code>float</code> Współrzędna Y w którym może znajdować się obiekt.
     * @return <code>boolean</code> True, jeśli obiekt występuje w danym punkcie, w przeciwnym razie False. 
     */
    public boolean isAtPoint(float x, float y);

    /**
     * Renderuje obiekt.<br>
     * <b>Wywoływane automatycznie.</b> <br>
     * Nie należy wywoływać metody ręcznie.
     */
    public void draw(GL10 gl);

    /**
     * Aktualizuje obiekt, jeśli istnieje taka potrzeba.<br>
     * <b>Wywoływane automatycznie.</b> <br>
     * Nie należy wywoływać metody ręcznie.
     * 
     * @param elapsedTime
     *            <code>long</code> czas sceny.
     */
    public void update(long elapsedTime);
}
